/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.adrs;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Descarte;
import br.ufc.quixada.adrs.model.Movimentacao;
import br.ufc.quixada.adrs.model.QuestionarioQuantitativo;
import br.ufc.quixada.adrs.model.Rebanho;
import br.ufc.quixada.adrs.model.TipoAnimal;
import br.ufc.quixada.adrs.model.Visita;
import br.ufc.quixada.adrs.service.FaixaEtariaService;
import br.ufc.quixada.adrs.service.TipoAnimalService;
import br.ufc.quixada.adrs.service.VisitaService;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.UtilAdrs;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Caio
 */
public class CmdAddQuestionarioQuantitativo implements Comando {

    private TipoAnimalService ts = new TipoAnimalService();
    private FaixaEtariaService fs = new FaixaEtariaService();
    private TipoAnimal caprino = ts.getTipoAnimalById(TipoAnimal.TIPO_ANIMAL_CAPRINO);
    private TipoAnimal ovino = ts.getTipoAnimalById(TipoAnimal.TIPO_ANIMAL_OVINO);
    private boolean erroDeValidacao;

    public String executa(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        erroDeValidacao = false;
        if (request.getParameter("concluded").equals("false")) {
            VisitaService vs = new VisitaService();
            Visita v = (Visita) session.getAttribute("visita");

            v.setData(UtilAdrs.treatToDate(request.getParameter("data")));
            if (v.getData() == null) {
                session.setAttribute("erro", Msg.INPUT_ERROR_WRONG_VISITA_DATE_FORMAT);
                return "/adrs/adrs_add_visita.jsp";
            }

            if (ts.getAllTiposAnimais().size() < 2) {
                session.setAttribute("erro", "Erro grave: ausência de tipos animais no banco de dados.");
                return "/adrs/index.jsp";
            }

            int caprinosAnterior = vs.getRebanhoAnterior(v, caprino);
            int ovinosAnterior = vs.getRebanhoAnterior(v, ovino);

            session.setAttribute("tiposAnimais", ts.getAllTiposAnimais());
            session.setAttribute("faixasEtarias", fs.getAllFaixasEtarias());
            session.setAttribute("caprinosAnterior", caprinosAnterior);
            session.setAttribute("ovinosAnterior", ovinosAnterior);

            return "/adrs/adrs_add_quest_quantitativo.jsp";
        } else {

            if (fs.getAllFaixasEtarias().size() < 3) {
                session.setAttribute("erro", "Erro Grave: ausência de faixas etárias no banco de dados.");
                return "/adrs/index.jsp";
            }

            Visita v = (Visita) session.getAttribute("visita");

            QuestionarioQuantitativo qqt = new QuestionarioQuantitativo();
            v.setQuestionarioQuantitativo(qqt);
            qqt.setVisita(v);

            String relato = request.getParameter("relato");
            if (relato == null || relato.length() == 0) {
                relato = Msg.RELATO_VAZIO;
            }
            qqt.setRelato(relato);

            Movimentacao mCap = new Movimentacao();
            Movimentacao mOvi = new Movimentacao();

            mCap.setQuantidadeAnterior(validateAndGetMovimentacaoField("cap_ant", request));
            mCap.setNascidos(validateAndGetMovimentacaoField("cap_nas", request));
            mCap.setMortos(validateAndGetMovimentacaoField("cap_mor", request));
            mCap.setVendidos(validateAndGetMovimentacaoField("cap_ven", request));
            mCap.setComprados(validateAndGetMovimentacaoField("cap_com", request));
            mCap.setRoubados(validateAndGetMovimentacaoField("cap_rou", request));
            mCap.setQuantidadeAtual(validateAndGetMovimentacaoField("cap_atu", request));
            mCap.setTipoAnimal(caprino);
            mCap.setQuestionarioQuantitativo(v.getQuestionarioQuantitativo());
            qqt.getMovimentacoes().add(mCap);

            mOvi.setQuantidadeAnterior(validateAndGetMovimentacaoField("ovi_ant", request));
            mOvi.setNascidos(validateAndGetMovimentacaoField("ovi_nas", request));
            mOvi.setMortos(validateAndGetMovimentacaoField("ovi_mor", request));
            mOvi.setVendidos(validateAndGetMovimentacaoField("ovi_ven", request));
            mOvi.setComprados(validateAndGetMovimentacaoField("ovi_com", request));
            mOvi.setRoubados(validateAndGetMovimentacaoField("ovi_rou", request));
            mOvi.setQuantidadeAtual(validateAndGetMovimentacaoField("ovi_atu", request));
            mOvi.setTipoAnimal(ovino);
            mOvi.setQuestionarioQuantitativo(v.getQuestionarioQuantitativo());
            qqt.getMovimentacoes().add(mOvi);

            validateAndAddRebanhoByField("cap_fem_0", request, qqt);
            validateAndAddRebanhoByField("cap_fem_6", request, qqt);
            validateAndAddRebanhoByField("cap_fem_12", request, qqt);
            validateAndAddRebanhoByField("cap_mac_0", request, qqt);
            validateAndAddRebanhoByField("cap_mac_6", request, qqt);
            validateAndAddRebanhoByField("cap_mac_12", request, qqt);

            validateAndAddRebanhoByField("ovi_fem_0", request, qqt);
            validateAndAddRebanhoByField("ovi_fem_6", request, qqt);
            validateAndAddRebanhoByField("ovi_fem_12", request, qqt);
            validateAndAddRebanhoByField("ovi_mac_0", request, qqt);
            validateAndAddRebanhoByField("ovi_mac_6", request, qqt);
            validateAndAddRebanhoByField("ovi_mac_12", request, qqt);

            validateAndAddDescarteByField("m1_cap_fem", request, qqt);
            validateAndAddDescarteByField("m1_ovi_fem", request, qqt);
            validateAndAddDescarteByField("m1_cap_mac", request, qqt);
            validateAndAddDescarteByField("m1_ovi_mac", request, qqt);

            validateAndAddDescarteByField("m2_cap_fem", request, qqt);
            validateAndAddDescarteByField("m2_ovi_fem", request, qqt);
            validateAndAddDescarteByField("m2_cap_mac", request, qqt);
            validateAndAddDescarteByField("m2_ovi_mac", request, qqt);

            validateAndAddDescarteByField("m3_cap_fem", request, qqt);
            validateAndAddDescarteByField("m3_ovi_fem", request, qqt);
            validateAndAddDescarteByField("m3_cap_mac", request, qqt);
            validateAndAddDescarteByField("m3_ovi_mac", request, qqt);

            validateAndAddDescarteByField("m4_cap_fem", request, qqt);
            validateAndAddDescarteByField("m4_ovi_fem", request, qqt);
            validateAndAddDescarteByField("m4_cap_mac", request, qqt);
            validateAndAddDescarteByField("m4_ovi_mac", request, qqt);

            validateAndAddDescarteByField("m5_cap_fem", request, qqt);
            validateAndAddDescarteByField("m5_ovi_fem", request, qqt);
            validateAndAddDescarteByField("m5_cap_mac", request, qqt);
            validateAndAddDescarteByField("m5_ovi_mac", request, qqt);

            validateAndAddDescarteByField("m6_cap_fem", request, qqt);
            validateAndAddDescarteByField("m6_ovi_fem", request, qqt);
            validateAndAddDescarteByField("m6_cap_mac", request, qqt);
            validateAndAddDescarteByField("m6_ovi_mac", request, qqt);

            qqt.setDataAtualizacao(UtilAdrs.treatToDate(request.getParameter("data_atu2")));
            if (qqt.getDataAtualizacao() == null) {
                session.setAttribute("erro", Msg.INPUT_ERROR_WRONG_CONTAGEM_DATE_FORMAT);
                v.setQuestionarioQuantitativo(qqt);
                session.setAttribute("visitaAEditar", v);
                return "/adrs/adrs_add_quest_quantitativo.jsp";
            }

            if (erroDeValidacao) {
                session.setAttribute("erro", Msg.NOT_POSITIVE_NUMERIC);
                v.setQuestionarioQuantitativo(qqt);
                session.setAttribute("visitaAEditar", v);
                return "/adrs/adrs_add_quest_quantitativo.jsp";
            }

            //fim da construcao
            v.setQuestionarioQuantitativo(qqt);
            session.setAttribute("visita", v);
            session.setAttribute("sucesso", Msg.QUESTIONNAIRE_TEMPORARILY_KEPT);
            return "/adrs/adrs_add_visita.jsp";
        }
    }

    private int validateAndGetMovimentacaoField(String fieldName, HttpServletRequest request) {
        String fieldValue = request.getParameter(fieldName);
        if (!fieldValue.equals("")) {
            if (!UtilAdrs.isNumber(fieldValue)) {
                erroDeValidacao = true;
                return 0;
            } else {
                if (Integer.parseInt(fieldValue) < 0) {
                    erroDeValidacao = true;
                    return 0;
                } else {
                    return Integer.parseInt(fieldValue);
                }
            }
        } else {
            return 0;
        }
    }

    private void validateAndAddRebanhoByField(String fieldName, HttpServletRequest request, QuestionarioQuantitativo qqt) {
        String fieldValue = request.getParameter(fieldName);
        if (!UtilAdrs.isNumber(fieldValue)) {
            erroDeValidacao = true;
        } else {
            if (!fieldValue.equals("") && Integer.parseInt(fieldValue) > 0) {
                Rebanho r = new Rebanho();
                r.setFaixaEtaria(fs.getFaixaEtariaByLimiteInferior(Integer.parseInt(fieldName.split("_")[2])));
                r.setQuantidade(Integer.parseInt(fieldValue));
                r.setSexo(fieldName.contains("fem") ? "F" : "M");
                r.setTipoAnimal(fieldName.contains("cap") ? caprino : ovino);
                r.setQuestionarioQuantitativo(qqt);
                qqt.getRebanhos().add(r);
            } else if (Integer.parseInt(fieldValue) < 0) {
                erroDeValidacao = true;
            }
        }
    }

    private void validateAndAddDescarteByField(String fieldName, HttpServletRequest request, QuestionarioQuantitativo qqt) {
        String fieldValue = request.getParameter(fieldName);
        if (!UtilAdrs.isNumber(fieldValue)) {
            erroDeValidacao = true;
        } else {
            if (!fieldValue.equals("") && Integer.parseInt(fieldValue) > 0) {
                Descarte d = new Descarte();
                d.setMes(Integer.parseInt(fieldName.split("_")[0].substring(1)));
                d.setSexo(fieldName.contains("fem") ? "F" : "M");
                d.setTipoAnimal(fieldName.contains("cap") ? caprino : ovino);
                d.setQuantidade(Integer.parseInt(fieldValue));
                d.setQuestionarioQuantitativo(qqt);
                qqt.getDescartes().add(d);
            } else if (Integer.parseInt(fieldValue) < 0) {
                erroDeValidacao = true;
            }
        }
    }
}
